/**
 * 询价.COM v1.0.0
 * http://xun-jia.com/
 *
 * Copyright (c) 2009 
 * 四川漾天空网络科技有限公司
 * 成都市天府软件园A3栋2楼
 *
 */
package com.xunjia.util;

import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.Text;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

/**
 * @author Mark
 * 
 * @Email Mark_yang@xun-jia.com
 * 
 * @Date 2009-4-15 下午01:41:22
 * 
 */
public class XMLUtils implements Serializable {
	private static final long serialVersionUID = -6384685843265101775L;
	private static final String URL = "getAdvertismentClickData.do?advertisementID=";

	/**
	 * 复制目标文件中不需要改变的内容
	 * 
	 * @param filepath
	 *            源文件路径
	 * @param excludeElementName
	 *            需要动态改变内容的节点名称
	 * @return
	 * @throws DocumentException
	 */
	public static Document copyDestFile(String filepath, String excludeElementName) throws DocumentException {
		// 如果两个参数中的任意一个为空,则返回NULL
		if (StringUtil.isEmpty(filepath) || StringUtil.isEmpty(excludeElementName)) {
			return null;
		}
		// XML文件读取
		SAXReader xmlReader = new SAXReader();
		// 创建文件
		File file = new File(filepath);
		// 读取XML文件
		Document dest = xmlReader.read(file);
		// 获取根元素
		Element root = dest.getRootElement();
		// 获取根元素的所有子元素
		Iterator<Node> it = root.nodeIterator();

		// 创建根元素settings
		Element rootEle_Settings = DocumentHelper.createElement(root.getName());
		// 创建新的XML文件
		Document doc = DocumentHelper.createDocument(rootEle_Settings);

		// 复制
		while (it.hasNext()) {
			// 获取下一元素
			Node node = it.next();
			// 如果元素不为文本类型,并且不是需要动态改变内容的节点
			if (!(node instanceof Text) && !excludeElementName.equals(node.getName())) {
				// 将此节点添加至rootEle_Settings
				rootEle_Settings.add(root.element(node.getName()).createCopy());
			}
		}
		// 返回复制后的Document
		return doc;
	}

	/**
	 * 从指定文件获取指定元素
	 * 
	 * @param doc
	 *            文件
	 * @param elementPath
	 *            元素路径(XPath)
	 * @return
	 */
	public static Element getNeedChangeElement(Document doc, String elementPath) {
		List<Element> target = doc.selectNodes(elementPath);
		if (target != null && target.size() > 0)
			return target.get(0);
		return null;
	}

	/**
	 * 添加子元素(修改模板元素)
	 * 
	 * @param doc
	 *            需要添加子元素的文档对象
	 * @param data
	 *            数据
	 * @param parentNodeNameOfItem
	 *            元素项父节点名称
	 * @param item
	 *            直接修改拷贝元素项对象
	 * @return
	 */
	public static void appendChild(Document doc, List data, String parentNodeNameOfItem, Element item, String userID) {
		// 创建数据项的父元素
		Element parent = doc.getRootElement().addElement(parentNodeNameOfItem);
		// 次数
		int times = 0;
		if ("TC1007".equals(userID)) {
			times = 0;
		} else {
			times = 2;
		}
		// 添加数据项
		for (Object obj : data) {
			times++;
			// 创建源数据项拷贝
			Element tmp = item.createCopy();
			// 设置TITLE
			tmp.element("title").setText("Advertisement" + times);
			tmp.element("short").setText(times + "C");
			tmp.element("file_name").setText(URL + times);
			// 添加数据项
			parent.add(tmp);
		}
	}

	/**
	 * 将文档写入到指定文件
	 * 
	 * @param doc
	 *            源文档
	 * @param out
	 *            目标文件
	 */
	public static void writeToFile(Document doc, OutputStream dest) {
		try {
			// 新建输出文档格式
			OutputFormat format = OutputFormat.createPrettyPrint();
			// 新建文档输出类
			XMLWriter writer = new XMLWriter(dest, format);
			// 写入文件
			writer.write(doc);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
